// pages/films/index.js
Page({
	onReachBottom(){ //触底时执行
		this.types() //不带参数，用于区分手动点击
	},
	sleep(job,ms) { //返回一个Promise对象
		return new Promise((resolve, reject) => {
			setTimeout(() => {
				console.log(job + ' done!')
				resolve()
			}, ms)
		})
	},
	async Demo() { //await修饰的语句所在的函数必须用async修饰
		await this.sleep('job1',3000) //await会等待后面的Promise返回结果
		await this.sleep('job2',2000)
		await this.sleep('job3',1000)
	},
	regexTest(){ //正则编程测试
		let s='aaa123 www  bbb456 ccc789  567'
		let r, regex=/([a-zA-Z]+)([0-9]+)/g
		while(r=regex.exec(s)){ //若r==null，表示没有匹配成功
			console.log(r) //["aaa123", "aaa", "123", index: 0, input: "aaa123 www  bbb456 ccc789  567", groups: undefined]
		}
	},
	onLoad(e) { //页面加载时执行
		this.host='https://www.gow64.com' //主机的地址
		// this.Demo()
		//this.regexTest()
		let data = wx.getStorageSync('menus') //读取手机缓存的数据
		if (data) this.setData(data) //若有缓存的数据就设置为页面数据
	},
	async types(e) { //点击类型项时执行
		let menuIndex = this.data.menuIndex //当前菜单项索引号
		let menu = this.data.menus[menuIndex] //当前菜单项
		let typeIndex = e?e.target.dataset.index:menu.typeIndex //点击类型项的索引号
		if (typeIndex == null) return //没有点击在类型项上，就直接返回
		let change = {} //记录有变化的数据
		if(e){ //处理手动点击类型的效果
			let oldTypeIndex = menu.typeIndex //原来选择的类型项的索引号
			if (oldTypeIndex != null) change[`menus[${menuIndex}].types[${oldTypeIndex}].selected`] = false
			change[`menus[${menuIndex}].types[${typeIndex}].selected`] = true
			change[`menus[${menuIndex}].typeIndex`] = typeIndex
			this.setData(change)
		}
		
		let type= menu.types[typeIndex] //点击的类型项
		if(type.list && type.list.length>0 && e)return //已经有列表数据，就直接返回
		let list=await this.getTypeList(menu, type) //获取列表数据: (1)null (2)[]没有更多数据 (3)[...]列表数据
		if(list==null){
			wx.showModal({ //显示模态对话框
				content: '读取信息失败，请稍后再试~',
				showCancel: false //不再显示取消按钮
			})
			return
		}
		change={}
		if(list.length==0){ //没有更多的数据
			wx.showModal({ //显示模态对话框
				content: '没有发现更多的数据~',
				showCancel: false //不再显示取消按钮
			})
			change[`menus[${menuIndex}].types[${typeIndex}].nextPage`]=-1 //-1表示没有更多数据
		}else{ //有数据，需要把数据更新到页面显示出来
			let offset=type.list?.length || 0
			list.forEach(it=>{
				change[`menus[${menuIndex}].types[${typeIndex}].list[${offset++}]`]=it
			})
			change[`menus[${menuIndex}].types[${typeIndex}].nextPage`]=(type.nextPage||1)+1
		}
		this.setData(change)
	},
	search(e){ //搜索时执行
		console.log(e);
		let searchKey=e.detail.value.trim() //搜索的关键字，删除前后的空白
		if(!searchKey)return
		this.setData({
			searchKey,
			[`menus[1].types[0].list`]:[],
			[`menus[1].types[0].nextPage`]: 1,
		}, ()=>{
			this.types({target:{dataset:{index:0}}})
		})
	},
	async getTypeList(menu, type){ //获取menu菜单下type类型的视频列表
		let nextPage=type.nextPage||1 //获取要读取的页码
		if(nextPage==-1)return [] //返回空数组表示没有更多的数据了
		// https://www.gow64.com/by/5-3.html
		let url=`${this.host}/by/${type.id}-${nextPage}.html` //列表页面的地址
		if(menu.name=='[搜索]')url=`${this.host}/search.php?page=${nextPage}&searchword=${encodeURIComponent(this.data.searchKey)}&searchtype=`
		let app=getApp() //获取小程序对象
		let html=await app.request({ url }) //获取页面的html文本
		if(html==null) return null
		let r, list=[], regex=/href="([^"]+)[^>]+><img class="lazyload" data-src="([^"]+)" src="[^"]+" alt="([^"]+)">/g
		while(r=regex.exec(html)){ //匹配成功
			if(!(type.list||[]).some(v=>v.url==r[1])){ //找到的数据在页面中不存在时才保存
				list.push({
					url: r[1], //地址
					img: r[2], //图片
					title: r[3], //标题
				})
			}
		}
		return list
	},
	menus(e) { //点击菜单时执行
		let menuIndex = e.currentTarget.dataset.index //点击菜单的索引号
		if (menuIndex == 0) { //点击的是刷新
			let menuIndex = this.data.menuIndex //当前菜单项索引号
			let menu = this.data.menus[menuIndex] //当前菜单项
			let typeIndex = menu.typeIndex //当前类型项的索引号
			if(typeIndex==null){ //没有选择类型
				wx.showModal({
					content: '必须选择一个类型才能进行刷新~',
					showCancel: false,
				})
			}else{ //有类型
				this.setData({
					[`menus[${menuIndex}].types[${typeIndex}].list`]:[], //清空原来的数据
					[`menus[${menuIndex}].types[${typeIndex}].nextPage`]:1, //准备读取第一个页面的内容
				}, ()=>{ //模拟手动点击类型
					this.types({target:{dataset:{index:typeIndex}}}) //target.dataset.index
				})
			}
			return
		}
		let oldIndex = this.data.menuIndex //原来点击的菜单的索引号
		let change = {
			menuIndex
		} //记录有变化的数据
		change[`menus[${oldIndex}].selected`] = false
		change[`menus[${menuIndex}].selected`] = true
		this.setData(change)
	},

	onUnload() { //页面销毁时执行
		console.log("onUnload")
		this.save()
	},
	onHide() { //页面从前台变为后台时执行
		console.log("onHide")
		this.save()
	},
	save() { //保存页面数据
		let data = this.data
		delete data.__webviewId__
		wx.setStorageSync('menus', data) //保存页面数据到手机缓存
	},
	play(e){
		let index=e.currentTarget.dataset.index //点击视频列表的索引号
		wx.navigateTo({
			url: `./player?index=${index}`,
		})
	},
	// 正则表达式
	//  ( ） 分组，替换时 $1表示分组1的内容，$2表示分组2的内容，...
	//  \d 表示任意的一位数字0-9
	//  \d+ 表示任意连续的多位数组，+修饰前面的\d, 表示\d至少出现 1 次
	//  [xyz] 表示可以是x\y\z三者中的任意一个字符
	//  [a-z] 匹配一位英文小写字符
	//  [a-z#@A-Z] 匹配英文大小写字符或者#，@中的任意一个字符
	//  [^a-j] 匹配不是a-j的任意字符
	//  .  可以匹配任意字符，除了换行 \n
	//  |  或者，比如：aaa|bbb可以匹配aaa或者bbb

	// 量词
	// (1) + 至少出现1次
	// (2) * 至少出现0次
	// (3) ? （1)只能出现0次或者1次， (2)若修饰量词时表示 “非贪婪模式”
	// {3, 8} 出现3到8次

	// 修饰符
	// (1) g  全局匹配
	// (2) s  单行模式，此时.可以匹配\n
	data: {
		menuIndex: 2,
		menus: [{
			name: '[刷新]'
		}, {
			name: '[搜索]',
		}, {
			name: '电影',
			selected: true,
			types: [
				{ name: '动作片', id: 14 },
				{ name: '喜剧片', id: 15 },
				{ name: '爱情片', id: 16 },
				{ name: '科幻片', id: 17 },
				{ name: '恐怖片', id: 18 },
				{ name: '剧情片', id: 19 },
				{ name: '战争片', id: 20 },
				{ name: '纪录片', id: 21 },
			]
		}, {
			name: '电视剧',
			types: [
				{ name: '国产剧', id: 5 },
				{ name: '香港剧', id: 6 },
				{ name: '台湾剧', id: 7 },
				{ name: '欧美剧', id: 8 },
				{ name: '韩国剧', id: 9 },
				{ name: '日本剧', id: 10 },
				{ name: '泰国剧', id: 11 },
				{ name: '海外剧', id: 12 },
				{ name: '短剧', id: 13 },
			]
		}, {
			name: '综艺',
			types: [
				{ name: '大陆综艺', id: 22 },
				{ name: '港台综艺', id: 23 },
				{ name: '欧美综艺', id: 24 },
				{ name: '日韩综艺', id: 25 },
			]
		}, {
			name: '动漫',
			types: [
				{ name: '国产动漫', id: 26 },
				{ name: '日韩动漫', id: 27 },
				{ name: '欧美动漫', id: 28 },
				{ name: '海外动漫', id: 29 },
				{ name: '动漫电影', id: 30 },
			]
		}]
	},

})